﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Design;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Media;

using _XNA__RunningDeath.DTO;
using _XNA__RunningDeath.GLO;

namespace _XNA__RunningDeath.BUS
{
    class CNhanVat_BUS
    {
        #region contractor

        CNhanVat_DTO _nhanvat;
        int _frameTime ;                            // Thời gian của 1 khung hình
        int _frameStand ;                           // thời gian hiện tại
        Vector2 _pointstand;                        // Vị trí cơ bạn của nhân vật
        KeyboardState _key;                         // Trạng thái Key
        bool _isleap;                               // Actor đang nhảy;
        public Rectangle recNhanVat;                // Vẽ ra khung bao nhân vật để tiếng hành xử lý va chạm

        public Vector2 _pointCurent;
        #endregion

        /// <summary>
        /// Hàm khởi tạo Lớp xử lý
        /// </summary>
        /// <param name="content"></param>
        /// <param name="gameTime"></param>
        /// <param name="spriteBatch"></param>
        public CNhanVat_BUS(ContentManager content, GameTime gameTime, SpriteBatch spriteBatch)
        {
            this._nhanvat = new _XNA__RunningDeath.DTO.NhanVat_DTO.CKhiZaZa(content, gameTime, spriteBatch);
            
            KhoiTao();//Gọi hàm để khởi tạo các đối tượng cần thiết cho game;

            ///khung bao nhân vật sẽ bằng tọa đọ hiện tại của nhân vật + với kích thước của nhân vật đó
            ///Cụ thể là bằng tọa độ x , y của nhân vật và chiều rông/cao của nhân vật
            if (CGLOBAL.NewGame == enumGame.mNew)
            {
                recNhanVat = new Rectangle((int)this._nhanvat.PointCurent.X, (int)this._nhanvat.PointCurent.Y, this._nhanvat.DspointRun["" + _nhanvat.Frame].Width, this._nhanvat.DspointRun["" + _nhanvat.Frame].Height);
                _pointCurent = this._nhanvat.PointCurent;
            }
            else if(CGLOBAL.NewGame == enumGame.mLoad)
            {
                recNhanVat = new Rectangle((int)this._nhanvat.PointCurent.X, (int)this._nhanvat.PointCurent.Y, this._nhanvat.DspointRun["" + _nhanvat.Frame].Width, this._nhanvat.DspointRun["" + _nhanvat.Frame].Height);
                _pointCurent = this._nhanvat.PointCurent = CGLOBAL.pointActor;
            }else
            {
                this._nhanvat.PointCurent = CGLOBAL.PointActorStand;
                recNhanVat = new Rectangle((int)this._nhanvat.PointCurent.X, (int)this._nhanvat.PointCurent.Y, this._nhanvat.DspointRun["" + _nhanvat.Frame].Width, this._nhanvat.DspointRun["" + _nhanvat.Frame].Height);
            }
           
        }

        /// <summary>
        /// Cập nhật lại trạng thái của game
        /// </summary>
        /// <param name="gameTime">Thơi gian của game hiện tại</param>
        public virtual void Update(GameTime gameTime)
        {
            //Cập nhật lại khung hình sau mỗi lần update
            _frameStand += (int)gameTime.ElapsedGameTime.TotalMilliseconds;

            //Cập nhật lại khung bao nhân vật
            recNhanVat = new Rectangle((int)this._nhanvat.PointCurent.X, (int)this._nhanvat.PointCurent.Y, this._nhanvat.DspointRun["" + _nhanvat.Frame].Width-10, this._nhanvat.DspointRun["" + _nhanvat.Frame].Height);
           
            //Tính khung hình của nhân vật
            if (_frameStand >= _frameTime){
                this._nhanvat.Frame++;
                _frameStand = 0;
            }
            //Nếu khung hình nhân vật mà mình set vượt với tổng số khung hình hiện có thì reset cho nó về lại từ đầu
            if (this._nhanvat.Frame == this._nhanvat.SkinLengh)
            {
                this._nhanvat.Frame = 1;

                if(this._nhanvat.Trangthai == enumState.life)
                    this._nhanvat.SongeffRun.Play(CThamSo.volumSound, CThamSo.pitchSound, CThamSo.panSound);
            }

            if (this._nhanvat.Trangthai == enumState.die)
            {
                CGLOBAL.timevibiGameOver += gameTime.ElapsedGameTime.TotalMilliseconds;
                if (CGLOBAL.timevibiGameOver >= CThamSo.timevibiGameOver)
                NhayTuDo();
            }
            else if (this._nhanvat.Trangthai == enumState.lost)
            {
                RoiTuDo();
            }else
            {
                _key = Keyboard.GetState();
                if (_key.IsKeyDown(CThamSo.KeyNhay1) && !_isleap || _key.IsKeyDown(CThamSo.KeyNhay2) && !_isleap)
                {
                    NhayLen();
                    _nhanvat.Trangthai = enumState.leap;
                    this._nhanvat.SongeffLeap.Play(CThamSo.volumSound, CThamSo.pitchSound, CThamSo.panSound);
                }
                else
                {
                    _isleap = true;
                    NhayXuong();
                }
            }
            CGLOBAL.pointActor = _pointCurent = this._nhanvat.PointCurent;
            //Nếu nhân vật chết thi thực thi
        }

        /// <summary>
        /// Vẽ ra các khung hình của nhân vật
        /// </summary>
        /// <param name="gameTime"></param>
        public virtual void Draw(GameTime gameTime)
        {
            //Nếu trạng thái nhân vật hiện tại là sống thì sẽ vẽ các khung hình đang sống (Cụ thể ở đây là nhân vật đang chạy bình thường)
            if (this._nhanvat.Trangthai == enumState.life)
                this._nhanvat.SpriteBatch.Draw(this._nhanvat.TexSkin, this._nhanvat.PointCurent, this._nhanvat.DspointRun["" + _nhanvat.Frame], Color.White);
            
            //Ngược lại nếu trạng thái nhân vật là bay thì sẽ vẽ ra hình nhân vật bay
            else if (this._nhanvat.Trangthai == enumState.leap)
                this._nhanvat.SpriteBatch.Draw(this._nhanvat.Texleap, this._nhanvat.PointCurent, Color.White);

            // Nếu trạng thái nhân vật là chết thì vẽ ra hình nhân vật chết
            else if(this._nhanvat.Trangthai == enumState.die)
                this._nhanvat.SpriteBatch.Draw(this._nhanvat.Texdie, this._nhanvat.PointCurent, Color.White);

            //Ngược lại là trường hợp nhân vật đứng yên thì vẽ ra hình nhân vật đứng yên
            else
                this._nhanvat.SpriteBatch.Draw(this._nhanvat.TexPause, this._nhanvat.PointCurent, Color.White);
        }

        public void KhoiTao()
        {
            _frameTime = 200;                           //Sau khoảng thơi gian này nhân vật sẽ được đổi khung hình một lần
            _pointstand = CGLOBAL.PointActorStand;      //Set vị trí cơ bản của nhân vật (vị trí khi mới mở)
            _nhanvat.PoinMax = CGLOBAL.PointActorMax;   //Set vị trí cao nhất mà nhân vật có thể nhảy tới
            _nhanvat.PointCurent = _pointstand;         //Mới đầu vào game thì vị trí của game sẽ là vị trí căn bản
            _nhanvat.Trangthai = enumState.pause;       //Mới vào game thì nhân vật đứng yên
            _isleap = false;                            //Lúc mới vào game thì nhân vật không nhảy

        }

        #region Các Hành động của nhân vật

        /// <summary>
        /// Set Toa độ để Actor đi lên
        /// </summary>
        public void NhayLen()
        {
            if (this._nhanvat.PointCurent.Y <= 0)
                this._nhanvat.PointCurent = new Vector2(this._nhanvat.PointCurent.X, 0);
            else
                this._nhanvat.PointCurent = new Vector2(this._nhanvat.PointCurent.X, this._nhanvat.PointCurent.Y - CGLOBAL.SpeedActor);
        }

        /// <summary>
        /// Set Tọa độ để nhân vật rơi xuống
        /// </summary>
        public void NhayXuong()
        {
            if (this._nhanvat.PointCurent.Y >= _pointstand.Y)
            {
                this._nhanvat.PointCurent = _pointstand;
                _nhanvat.Trangthai = enumState.life;
                _isleap = false;
            }
            else
                this._nhanvat.PointCurent = new Vector2(this._nhanvat.PointCurent.X, this._nhanvat.PointCurent.Y + CGLOBAL.SpeedActor);

        }

        /// <summary>
        /// Chuyển động của nhân vật khi nhân vật Chết
        /// </summary>
        public void NhayTuDo()
        {
            if (this._nhanvat.PointCurent.Y + this.recNhanVat.Height > 0)
                this._nhanvat.PointCurent = new Vector2(this._nhanvat.PointCurent.X, this._nhanvat.PointCurent.Y - CGLOBAL.SpeedActor);
        }

        /// <summary>
        /// Chuyển động của nhân vật khi nhân rơi xuốt hố
        /// </summary>
        public void RoiTuDo()
        {
            if (this._nhanvat.PointCurent.Y + this.recNhanVat.Height < CThamSo.HightForm)
                this._nhanvat.PointCurent = new Vector2(this._nhanvat.PointCurent.X, this._nhanvat.PointCurent.Y + CGLOBAL.SpeedActor);
            else
                this._nhanvat.Trangthai = enumState.die;
        }

        #endregion

        #region Set các trạng thái cho nhân vật (Sống , Rơi, Chết)

        /// <summary>
        /// Gán trạng thái nhân vật thành chết
        /// </summary>
        public void setDie()
        {
            this._nhanvat.Trangthai = enumState.die;

        }

        /// <summary>
        /// Gán trạng thái nhân vật thành rơi
        /// </summary>
        public void setLost()
        {
            this._nhanvat.Trangthai = enumState.lost;

        }

        /// <summary>
        /// Gán trạng thái nhân vật thành Sống
        /// </summary>
        public void SetLife()
        {
            this._nhanvat.Trangthai = enumState.life;
            this._nhanvat.Life = 3;
            this._nhanvat.Score = 0;
        }

        #endregion

        #region Kiểm tra các trạng thái của nhân vật

        /// <summary>
        /// Kiểm tra nhân vật có chết không
        /// </summary>
        /// <returns>True : chết rồi hoặc False: chưa chết</returns>
        public bool IsDie()
        {
            if (this._nhanvat.Trangthai == enumState.die)
                return true;
            return false;
        }

        /// <summary>
        /// Kiểm tra nhân vật có rơi xuốt hố hay không
        /// </summary>
        /// <returns>True : đang rơi hoặc False: không rơi</returns>
        public bool IsLost()
        {
            if (this._nhanvat.Trangthai == enumState.lost)
                return true;
            return false;
        }

        #endregion

    }
}
